package com.example.shop.user.service;

import com.example.shop.common.dto.mail.TemplateMail;
import com.example.shop.common.dto.sms.ShortMessage;
import com.example.shop.pojo.User;
import com.example.shop.user.dto.RegisterParam;
import com.example.shop.common.api.ServiceReturn;
import com.example.shop.user.dto.UserPersonalInfoParam;

/**
 * 登录注册服务
 */
public interface UserService {

    /**
     * 进行注册用户信息的校验，校验其是否符合要求
     * @param registerParam 注册用户信息
     * @return 返回校验结果，如果符合要求，则返回true
     */
    ServiceReturn<Boolean> checkRegisterParam(RegisterParam registerParam);

    /**
     * 进行用户注册
     * @param registerParam 注册的用户信息
     * @return 返回注册状态，注册成功返回true
     */
    ServiceReturn<Boolean> register(RegisterParam registerParam);

    /**
     * 为当前登录的用户开启人脸识别功能
     * @param user 当前登录的用户
     * @param faceBase64 人脸图片
     * @return 返回开启状态，开启成功返回true
     */
    ServiceReturn<Boolean> enableFaceRecognition(User user,String faceBase64);

    /**
     * 禁用人脸识别。当你本来就没有开启人脸识别，则也不会是返回true
     * 如果开启了，则将其关闭，并返回true
     * @param user 当前登录的用户，也是要禁用人脸识别功能的用户
     * @return 返回关闭结果
     */
    ServiceReturn<Boolean> banFaceRecognition(User user);

    /**
     * 人脸识别登录
     * 如果传入的图片有多个人，则会根据识别出来的这些人，哪个是开启了人脸识别的
     * 如果所有人都是开启人脸识别的，那么就以识别可信度最高的那位作为返回的用户信息
     * @param faceBase64 传入一张人脸数据的base64字符串
     * @return 返回登录的用户信息，如果登录成功，则返回登录后的用户信息，否则返回null
     */
    ServiceReturn<User> faceRecognitionLogin(String faceBase64);

    /**
     * 手机号短信登录
     * @param phoneNumber 手机号
     * @param authCode 验证码
     * @return 返回登录的用户信息，如果登录成功，则返回登录后的用户信息，否则返回null
     */
    ServiceReturn<User> smsLogin(String phoneNumber,String authCode);

    /**
     * 账户密码登录
     * @param account 账户
     * @param password 密码
     * @return 返回登录的用户信息，如果登录成功，则返回登录后的用户信息，否则返回null
     */
    ServiceReturn<User> login(String account, String password);

    /**
     * 邮箱登录
     * @param to 接收验证码的to邮件
     * @param authCode 验证码
     * @return 返回登录的用户信息，如果登录成功，则返回登录后的用户信息，否则返回null
     */
    ServiceReturn<User> emailLogin(String to, String authCode);

    /**
     * 邮箱绑定
     * @param email 发送该验证码到要绑定的邮件
     * @param authCode 验证码
     * @return 返回绑定后的邮箱，如果绑定成功返回绑定后的邮箱，失败则返回null
     */
    ServiceReturn<String> bindEmail(User user,String email, String authCode);

    /**
     * 手机号绑定
     * @param phone 发送该验证码到要绑定的手机号
     * @param authCode 验证码
     * @return 返回绑定后的手机号，如果绑定成功返回绑定后的手机号，失败则返回null
     */
    ServiceReturn<String> bindPhone(User user,String phone, String authCode);

    /**
     * 进行邮箱的解除绑定
     * @param user 要解绑的用户，这里默认是session当前登录的用户
     * @param authCode 解绑的授权码
     * @return 返回解绑状态，成功返回true
     */
    ServiceReturn<Boolean> unbindEmail(User user,String authCode);

    /**
     * 进行手机号的解除绑定
     * @param user 要解绑的用户，这里默认是session当前登录的用户
     * @param authCode 解绑的授权码
     * @return 返回解绑状态，成功返回true
     */
    ServiceReturn<Boolean> unbindPhone(User user,String authCode);

    /**
     * 修改当前登录的用户密码。注意：这里是要登录后才可以的
     * @param user 要修改密码的用户，这里默认是session当前登录的用户
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 返回修改状态，成功返回true
     */
    ServiceReturn<Boolean> loginAfterChangePassword(User user,String oldPassword,String newPassword);

    /**
     * 未登录，就进行修改密码操作。即通过邮箱修改密码或者通过电话修改密码
     * @param fieldValue 手机号或者邮箱
     * @param newPassword 新密码
     * @return 返回修改状态，修改成功则返回true
     */
    ServiceReturn<Boolean> notLoginChangePassword(String fieldValue,String newPassword);

    /**
     * 校验修改密码的验证码。即通过邮箱或者手机号发送邮箱或者短信，来进行修改，而该方法是对其验证码进行校验
     * @param checkFieldValue 校验的手机号或者邮箱
     * @param authCode 验证码
     * @return 返回校验状态，如果验证码正确，则返回true
     */
    ServiceReturn<Boolean> checkChangePasswordAuthCode(String checkFieldValue, String authCode);

    /**
     * 发送登录授权到指定的邮箱中，并将用户信息和登录授权码缓存到redis中
     * @param templateMail 模板邮件
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendLoginAuthCodeToEmail(TemplateMail templateMail, String authCode);

    /**
     * 想指定的手机号发送短信
     * @param shortMessage 短信
     * @param authCode 验证
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendLoginAuthCodeToPhone(ShortMessage shortMessage, String authCode);

    /**
     * 发送绑定邮件
     * @param templateMail 模板邮件
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendBindAuthCodeToEmail(TemplateMail templateMail, String authCode);

    /**
     * 发送绑定手机号
     * @param shortMessage 短信
     * @param authCode 验证码
     * @return 返回业务处理结果
     */
    ServiceReturn<Boolean> sendBindAuthCodeToPhone(ShortMessage shortMessage, String authCode);

    /**
     * 发送解绑邮箱的邮件
     * @param templateMail 解绑邮件
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendUnbindAuthCodeToEmail(TemplateMail templateMail, String authCode);

    /**
     * 发送解绑手机号的短信
     * @param shortMessage 解绑邮件
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendUnbindAuthCodeToPhone(ShortMessage shortMessage, String authCode);

    /**
     * 发送修改密码的邮件。不需要登录就可以修改
     * @param templateMail 修改密码的邮件
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendChangePasswordToEmail(TemplateMail templateMail, String authCode);

    /**
     * 发送修改密码的短信。不需要登录就可以修改
     * @param shortMessage 修改密码的短信
     * @param authCode 验证码
     * @return 返回发送状态，发送成功则返回true
     */
    ServiceReturn<Boolean> sendChangePasswordToPhone(ShortMessage shortMessage, String authCode);

    /**
     * 验证码方式注销账户，发送注销邮件到注销账户对应的邮箱上
     * @param mail 注销账户对应的邮箱
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendCancellationToEmail(TemplateMail mail,String authCode);

    /**
     * 验证码方式注销账户，发送注销短信到注销账户对应的手机号上
     * @param shortMessage 注销账户对应的手机号
     * @param authCode 验证码
     * @return 返回发送状态，发送成功返回true
     */
    ServiceReturn<Boolean> sendCancellationToPhone(ShortMessage shortMessage, String authCode);


    /**
     * 将当前登录的用户进行登出
     * @param nowLoginUser 当前登录的用户
     */
    void loginOut(User nowLoginUser);

    /**
     * 当前登录的用户通过密码的方式注销账户
     * @param user 当前登录的用户
     * @param password 密码
     * @return 返回注销状态，注销成功返回true
     */
    ServiceReturn<Boolean> cancellationByPassword(User user,String password);

    /**
     * 当前登录的用户通过验证码的方式注销账户
     * @param user 当前登录的用户
     * @param authCode 授权码
     * @return 返回注销状态，注销成功返回true
     */
    ServiceReturn<Boolean> cancellationByAuthCode(User user,String authCode);

    /**
     * 更改个人信息
     * @param personalInfo 更新的个人信息
     * @return 返回修改后的用户信息，如果修改成功，则返回修改后的用户信息，否则返回null
     */
    ServiceReturn<User> updateUserInfo(User nowLoginUser,UserPersonalInfoParam personalInfo);



}
